#include <stdio.h>
#include <string.h>

#define array_length(arr) (sizeof(arr) == 0 ? 0: (sizeof(arr)/sizeof((arr)[0])))

void swap(int *x, int *y)   // parametros: direcciones
{
    int tmp = *x;
    *x = *y;                // contenidos de variables
    *y = tmp;
}
/*
char* get_message()
{
    char msg[] = "No son los punteros divertidos?";
    return msg; // función retorna dirección de la variable local
}
*/
int main(void)
{
    int arr[8] = {7, 6, 5, 4, 3, 2, 1, 0};
    int* p1 = &arr[0];
    int* p2 = arr;
    printf("arr[0] : %i, *p1 : %i, *p2 : %i\n", arr[0], *p1, *p2);
    printf("length of arr   : %i\n", array_length(arr));    // longitud del array, número de elementos del array
    printf("size of arr     : %i\n", sizeof(arr));          // tamaño del array, número de bytes del array
    /*
    char* string = get_message();   // puntero retornado invalido, después de que la variable de la función sale del ámbito
    puts(string);
    */
    /*
    int n = 4;
    double pi = 3.14159;
    int *pn = &n;
    double *ppi = &pi;

    // dirección de la variable de tipo t tiene tipo *t

    printf("variable n : %i --- pi : %g\n", *pn, *ppi);
    printf("suma : %g\n", *pn + *ppi);

    int a = 5, b = 7;
    printf("a : %i, b : %i\n", a, b);
    swap(&a, &b);
    printf("a : %i, b : %i\n", a, b);
    */

    /*
    char str1[] = "I am a string";
    char str2[20] = "I am a string";

    printf("out 1 : %s | sizeof str1 : %i\n", str1, sizeof(str1));
    printf("out 2 : %s | strlen str1 : %i\n", str1, strlen(str1));

    printf("out 3 : %s | sizeof str2 : %i\n", str2, sizeof(str2));
    printf("out 4 : %s | strlen str2 : %i\n", str2, strlen(str2));
    */

    //    printf("sizeof str2 : %i\n", sizeof(str2));
//    printf("strlen str2 : %i\n", strlen(str2));

    /*
    int i = 0, n = 20;
    goto loop_cond;

    loop_body :
    i++;

    loop_cond :
    if (i < n)
        goto loop_body;

    printf("i = %d\n" , i);
    printf("Hello World!\n");
    */

    return 0;
}

